﻿using UnityEngine;
using System.Collections;
using System;
using System.Runtime.InteropServices;
namespace CreatPart
{
    /// <summary>
    /// 参考
    /// Url:http://www.cnblogs.com/U-tansuo/archive/2012/07/10/GetOpenFileName.html
    /// Url:https://msdn.microsoft.com/en-us/library/windows/desktop/ff468808(v=vs.85).aspx
    /// Url:https://msdn.microsoft.com/en-us/library/windows/desktop/bb776426(v=vs.85).aspx
    /// Url:http://blog.csdn.net/cwj649956781/article/details/76218218
    /// </summary>
    public class WindowsForms
    {
        [DllImport("Comdlg32.dll", SetLastError = true, ThrowOnUnmappableChar = true, CharSet = CharSet.Auto)]
        private static extern bool GetOpenFileName([In, Out] FileName ofn);
        [DllImport("Comdlg32.dll", SetLastError = true, ThrowOnUnmappableChar = true, CharSet = CharSet.Auto)]
        private static extern bool GetSaveFileName([In, Out] FileName ofd);
        [DllImport("shell32.dll", SetLastError = true, ThrowOnUnmappableChar = true, CharSet = CharSet.Auto)]
        private static extern IntPtr SHBrowseForFolder([In, Out] DirName ofn);

        [DllImport("shell32.dll", SetLastError = true, ThrowOnUnmappableChar = true, CharSet = CharSet.Auto)]
        private static extern bool SHGetPathFromIDList([In] IntPtr pidl, [In, Out] char[] fileName);
        public static string Load(params string[] ext)
        {
            FileName i = new FileName(ext);
            i.title = "打开";
            GetOpenFileName(i);
            return i.file;
        }
        public static string Save(string ext)
        {
            FileName i = new FileName(ext);
            i.title = "保存";
            GetSaveFileName(i);
            return i.file;
        }
        public static string GetDir()
        {
            DirName d = new DirName();
            IntPtr i = SHBrowseForFolder(d);
            char[] c = new char[30];
            SHGetPathFromIDList(i, c);

            string url = null;

            for (int j = 0; j < c.Length; j++)
            {
                if (c[j].GetHashCode()!=0)
                {
                    url += c[j];
                }
            }

            return url;
        }
        [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
        private class DirName
        {
            public IntPtr hwndOwner = IntPtr.Zero;
            public IntPtr pidlRoot = IntPtr.Zero;
            public String pszDisplayName = null;
            public String lpszTitle = null;
            public UInt32 ulFlags = 0;
            public IntPtr lpfn = IntPtr.Zero;
            public IntPtr lParam = IntPtr.Zero;
            public int iImage = 0;
            public DirName()
            {
                pszDisplayName = new string(new char[256]);
                ulFlags = 0x00000040 | 0x00000010; //BIF_NEWDIALOGSTYLE | BIF_EDITBOX;
                lpszTitle = "打开目录";
            }
        }
        [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
        private class FileName
        {
            public int structSize = 0;
            private IntPtr dlgOwner = IntPtr.Zero;
            private IntPtr instance = IntPtr.Zero;
            private string filter = null;
            private string customFilter = null;
            private int maxCustFilter = 0;
            private int filterIndex = 0;
            public string file { get; set; }
            private int maxFile = 0;
            public string fileTitle { get; set; }
            private int maxFileTitle = 0;
            public string initialDir { get; set; }
            public string title { get; set; }
            private int flags = 0;
            private short fileOffset = 0;
            private short fileExtension = 0;
            private string defExt = null;
            private IntPtr custData = IntPtr.Zero;
            private IntPtr hook = IntPtr.Zero;
            private string templateName = null;
            private IntPtr reservedPtr = IntPtr.Zero;
            private int reservedInt = 0;
            private int flagsEx = 0;
            public FileName(params string[] ext)
            {
                structSize = Marshal.SizeOf(this);
                defExt = ext[0];
                string n = null;
                string e = null;
                foreach (string _e in ext)
                {
                    if (_e == "*")
                    {
                        n += "All Files";
                        e += "*.*;";
                    }
                    else
                    {
                        string _n = "." + _e + ";";
                        n += _n;
                        e += "*" + _n;
                    }
                }
                n = n.Substring(0, n.Length - 1);
                filter = n + "\0" + e + "\0";
                file = new string(new char[256]);
                maxFile = file.Length;
                fileTitle = new string(new char[64]);
                maxFileTitle = fileTitle.Length;
                //flags = 0x00080000 | 0x00001000 | 0x00000800 | 0x00000200 | 0x00000008;//OFN_EXPLORER|OFN_FILEMUSTEXIST|OFN_PATHMUSTEXIST| OFN_ALLOWMULTISELECT|OFN_NOCHANGEDIR
                flags = 0x00080000 | 0x00001000 | 0x00000800 | 0x00000008;
                initialDir = Application.dataPath;
            }
        }
    }
}